//int odump encode(int infd, int outfd, struct odump opts *opts)


//36 ra |               |S
//32 fp |               |R
//28 gp |               |A
//-----------------------------
//24	|LongitudDelim	|
//20 t2 |               |L
//16 t1 |               |O
//12 t0 |               |C
//-----------------------------
//8  a2 |               |A
//4  a1 |               |B
//0  a0 |               |A
//-----------------------------
	.text
	.align	2
	.globl odump_encode
	.ent odump_encode

odump_encode:
	subu sp,sp,40 //creo un stack para una funcion non-leaf con 6 variables locales
	sw ra,36(sp)
	sw $fp,32(sp)
	sw gp,28(sp)
	move $fp,sp

	move s0,a0
	move s1,a1
	lw s2,0(a2) //s2 guarda el lenght

	sw s0,0(sp)
	sw s1,4(sp)
	sw a2,8(sp)

	// calculo longitud del delimitador
	lw		t0,8($fp)
	lw		a0,4(t0)
	la		t9,mystrlen
	jal		ra,t9
	sw		v0,24($fp)

	li t0,0
	li t1,0
	li t2,0

	sw t0,12(sp) //buffer de lectura
	sw t1,16(sp) //buffer para shifting
	sw t2,20(sp) //contador de caracteres

	move t3,zero
	addi t3,t3,-1 //t3 guarda codigo de error en lectura

mientras:
	li	v0,SYS_read		//Cargo v0 para leer (syscall)
	lw  a0, 0($fp)		// Primer parametro de SYS_READ es el File descriptor
	la	a1,12(sp)		//segundo una dirrecion a un buffer de lectura (t0)
	li	a2,1			//Cantidad de bytes a leer
	syscall


	beq v0,t3,error_lectura_o_escritura 	//salto si syscall devuelve -1

	beq	v0,zero,fin_mientras   	//si feof(f) termina el while

	srl t1,t0,6 				//me quedo con los dos ultimos bits
	addi a1,t1,48 				//le sumo el ascii del 0

	lw a0,4(sp)					//escribo en el archivo
	move a2,zero
	addi a2,a2,1
	jal my_write
	beq v0,t3,error_lectura_o_escritura 	//salto si syscall devuelve -1

	beq t2,s2,salto1 			//si la cantidad de caracteres es igual a lenght entonces inserto salto de línea

retorno_salto1:
	sll t1,t0,26
	srl t1,t1,29 				//me quedo con los 3 bits del medio
	addi a1,t1,48 				//le sumo el ascii del 0
	jal my_write				//escribo en el archivo
	beq v0,t3,error_lectura_o_escritura 	//salto si syscall devuelve -1

	beq t2,s2,salto2 			//si la cantidad de caracteres es igual a lenght entonces inserto salto de línea

retorno_salto2:
	sll t1,t0,29
	srl t1,t1,29 				//me quedo con los primeros 3 bits
	addi a1,t1,48 				//le sumo el ascii del 0
	jal my_write				//escribo en el archivo
	beq v0,t3,error_lectura_o_escritura 	//salto si syscall devuelve -1

	beq t2,s2,salto3 			//si la cantidad de caracteres es igual a lenght entonces inserto salto de línea
								//Sino escribe el delimitador
	li		v0,SYS_write
	lw		a0,4($fp)
	lw		t0,8($fp)
	lw		a1,4(t0)			// a1 = direccion de delimitador
	lw		a2,24($fp)			// a2 = longitud delimitador
	syscall

								// verifico errores de escritura
	lw		t0,24($fp)			// t0 = longitud delimitador
 	bne		v0,t0,error_lectura_o_escritura	// si no escribio la misma cantidad de bytes que el delimitador

	j mientras

done:
	move sp,$fp
	lw ra,36(sp)
	lw   $fp,32(sp)
	lw a0,0(sp)
	lw a1,4(sp)
	lw a2,8(sp)
	addu sp,sp, 40
	addi v0,zero,1
	jr    ra

fin_mientras:
	move v0,zero 				//la salida es correcta, devuelve 0
	j done

error_lectura_o_escritura:
	addi v0,zero,-1				// se produjo un error de R/W, devuelve -1
	j	done

salto1:

	move a1,zero
	addi a1,a1,'\n'
	jal my_write			 	//escribo en el archivo el salto de pagina
	beq v0,t3,error_lectura_o_escritura 	//salto si syscall devuelve -1

	j retorno_salto1
salto2:
	move a1,zero
	addi a1,a1,'\n'
	jal my_write				//escribo en el archivo el salto de pagina
	beq v0,t3,error_lectura_o_escritura 	//salto si syscall devuelve -1

	j retorno_salto2
salto3:
	move a1,zero
	addi a1,a1,'\n'
	jal my_write				//escribo en el archivo el salto de pagina
	beq v0,t3,error_lectura_o_escritura 	//salto si syscall devuelve -1

	j mientras


	.end odump_encode
